﻿using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;


namespace ADV_Evaluator.Data {

    /// <summary>
    /// プロジェクトデータ*.advprojに書き込む内容を集めたデータクラス。
    /// </summary>
    [Serializable]
    public class ProjectData {

        /// <summary>
        /// プロジェクト名
        /// </summary>
        public string Name;
        /// <summary>
        /// ゲームタイトル
        /// </summary>
        public string GameTitle;
        /// <summary>
        /// 初期読み込みシナリオ
        /// </summary>
        public string InitialScenario;
        /// <summary>
        /// ウィンドウの幅
        /// </summary>
        public int WindowWidth;
        /// <summary>
        /// ウィンドウの高さ
        /// </summary>
        public int WindowHeight;
        /// <summary>
        /// 前景レイヤー数
        /// </summary>
        public int LayerSlot;

        /// <summary>
        /// ファイル名
        /// </summary>
        public string FileName {
            get { return Name + Const.ProjectExtension; }
        }

        /// <summary>
        /// 初期値を指定したコンストラクタ
        /// </summary>
        /// <param name="name">プロジェクト名</param>
        /// <param name="initialScenario">初期シナリオ</param>
        /// <param name="gameTitle">ゲームタイトル</param>
        public ProjectData(string name, string initialScenario, string gameTitle) {
            Name = name;
            InitialScenario = initialScenario;
            GameTitle = gameTitle;
            WindowWidth = 800;
            WindowHeight = 600;
            LayerSlot = 1;
        }
        /// <summary>
        /// 初期値無しのコンストラクタ
        /// </summary>
        public ProjectData()
            : this("", "", "無題") {
        }

        /// <summary>
        /// プロジェクトデータを指定したファイルから読み込んで返す
        /// </summary>
        /// <param name="filename">読込先のファイル名</param>
        /// <returns>ProjectDataのインスタンス</returns>
        public static ProjectData Load(string filename) {
            ProjectData data;
            // ファイルを開く
            using (FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read)) {
                // 読み込んで逆シリアル化する
                BinaryFormatter bf = new BinaryFormatter();
                data = bf.Deserialize(fs) as ProjectData;
            }
            return data;
        }

        /// <summary>
        /// このオブジェクトの内容をXMLで書き込む
        /// </summary>
        public void Save() {
            // 書き込み先のファイル名は プロジェクト名.advproj
            string filename = Name + Const.ProjectExtension;
            // ファイルを開く
            FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write);
            // シリアル化して書き込む
            BinaryFormatter bf = new BinaryFormatter();
            bf.Serialize(fs, this);
            // ファイルを閉じる
            fs.Close();
        }

    }
}

